<?php
namespace Admin\Controller;
// use Think\Controller;
use Admin\Controller\PublicController;
class FilesController extends PublicController {
    // 当前用户的文件列表页
    public function index(){
        // 通不get方法获取参数
        $d = empty($_GET['d'])? 0: $_GET['d'];          // 当前目录ID
        $p = empty($_GET['p'])? 1: $_GET['p'];          // 当前分页码

        // 通过用户ID获取用户的文件列表信息
        $Files = M('files');
        // 进行分页数据查询 注意page方法的参数的前面部分是当前的页数使用 $_GET[p]获取
        $list = $Files->where(['user_id'=>$this->user_id, 'dir_id'=>$d])->order('id desc')->page($p.',3')->select();
        
        $count = $Files->where(['user_id'=>$this->user_id, 'dir_id'=>$d])->count();// 查询满足要求的总记录数
        $Page  = new \Think\Page($count,3);// 实例化分页类 传入总记录数和每页显示的记录数
        // $Page->setConfig('next','下一页');
        $show       = $Page->show();// 分页显示输出

        // 输出的列表还要包含文件夹的数据
        $Dir = M('dir');
        $dir_list = $Dir->where(['user_id'=>$this->user_id, 'p_id' => $d])->order('id desc')->select();
        // var_dump($dir_list);exit;
        
        $path_arr = $this->getDirPath($d);

        // 把数据传入模板
        $this->assign('path_arr', $path_arr);
        $this->assign('list', $list);
        $this->assign('dir_list', $dir_list);
        $this->assign('dir_id', $d);
        $this->assign('page',$show);// 赋值分页输出
        // 渲染模板
        $this->display();
    }

   
    // 用户添加文件页
    public function add(){
        if(!empty($_FILES)){
            // 调用上传文件的方法
            $info = $this->upload();
            $file = $info['file'];

            // 整理需要插入数据库的数据
            $upload_data = [];
            $upload_data['path'] = '/Uploads/'.$file['savepath'];
            $upload_data['file_name'] = $file['savename'];
            $upload_data['name'] = $file['name'];
            $upload_data['type'] = $file['type'];
            $upload_data['user_id'] = $this->user_id;
            $upload_data['dir_id'] = $_POST['dir_id'];          // 传入的当前目录ID
            if(!empty($_POST['desc'])){
                $upload_data['desc'] = $_POST['desc'];
            }
            
            // 实例化数据表操作对象
            $Files = M('files');

            $result = $Files->data($upload_data)->add();

            if(!empty($result)){
                $this->show('文件上传完成');
            }else{
                $this->show('文件上传失败');
            }
            exit;
        }

        $this->assign('dir_id', $_GET['dir_id']);
        // 渲染模板
        $this->display();
    }

    // 删除文件
    public function delete(){
        $id = $_GET['id'];
        if(empty($id)){
            $this->error('参数错误，请重新操作。');exit;
        }

        $Files = M('files');
        // 1、获取该文件的信息
        $file = $Files->where(['id'=>$id, 'user_id'=>$this->user_id])->find();

        // 组装文件在服务器中的路径
        $path = substr($file['path'].$file['file_name'], 1);
        
        // 2、删除服务器中的文件
        $res = unlink($path);
        if($res){
            // 3、删除该文件的数据库记录
            $result = $Files->where(['id'=>$id, 'user_id'=>$this->user_id])->delete();
            if(!empty($result)){
                $this->success('删除成功！', U('Files/index'));exit;
            }else{
                $this->error('删除失败');exit;
            }
        }else{
            $this->error('删除失败');exit;
        }
    }

    // 添加文件夹的方法
    public function addDir(){
        if(!empty($_POST)){
            $dir_name = $_POST['name'];
            // var_dump($dir_name);exit;

            $Dir = M('dir');
            // 整理插入数据库的数据
            $data = [
                'dir_name' => $dir_name,
                'user_id' => $this->user_id,
                'p_id' => $_POST['p_id']
            ];

            $result = $Dir->data($data)->add();
            if(!empty($result)){
                $this->success('添加目录成功！', U('Files/index'));exit;
            }else{
                $this->error('添加目录失败！');exit;
            }
        }

        $this->assign('dir_id', $_GET['dir_id']);

        $this->display();
    }

    // 移动目录
    public function moveDir(){
        if(!empty($_POST)){ 
            $data = [];
            $data['p_id'] = $_POST['p_id'];

            $Dir = M('dir');
            $result = $Dir->where(['id'=>$_POST['id']])->save($data);
            if(!empty($result)){ 
                $this->show('移动成功');exit;
            }else{ 
                $this->show('移动失败');exit;
            }
        }

        // 获取当前用户的目录列表数据
        $Dir = M('dir');
        // $dir_list = $Dir->where(['user_id'=>$this->user_id])->select();
        $dir_list = $this->getDirTree($_GET['dir_id']);
        echo "<pre>";
        // print_r($dir_list);exit;

        $this->assign('dir_id', $_GET['dir_id']);
        $this->assign('dir_list', $dir_list);
        $this->display();
    }

    public function upload(){
        $upload = new \Think\Upload();// 实例化上传类
        $upload->maxSize   =     3145728 ;// 设置附件上传大小
        $upload->exts      =     array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
        // $upload->rootPath  =     './Uploads/'; // 设置附件上传根目录
        $upload->savePath  =     '/'.$this->username.'/'; // 设置附件上传（子）目录
        // 上传文件 
        $info   =   $upload->upload();
        // echo '<pre>';
        // var_dump($info);exit;
        // if(!$info) {// 上传错误提示错误信息
        //     $this->error($upload->getError());
        // }else{// 上传成功
        //     $this->success('上传成功！');
        // }
        return $info;
    }

    // 获取文件夹路径的方法
    public function getDirPath($id = 0){
        $path_arr = [];
        $Dir = M('dir');

        // 通过循环，回朔文件夹路径
        // do{ 
        //     $dir = $Dir->where(['id'=>$id])->find();
        //     // $path_arr[] = $dir['dir_name'];
        //     $path_arr[] =[
        //         'path' =>  $dir['dir_name'],
        //         'href' => U('index', ['d' => $id])
        //     ];

        //     // 把当前文件夹的父级文件夹ID作为下一次查询的条件
        //     $id = $dir['p_id'];
        // }while ($id > 0);       // 当id为零意味着当前文件夹已经是顶级目录，跳出循环

        while ($id > 0) {
            $dir = $Dir->where(['id'=>$id])->find();
            // $path_arr[] = $dir['dir_name'];
            $path_arr[] =[
                'path' =>  $dir['dir_name'],
                'href' => U('index', ['d' => $id])
            ];

            // 把当前文件夹的父级文件夹ID作为下一次查询的条件
            $id = $dir['p_id'];
        }   
        $path_arr[] = [
            'path' => '根目录',
            'href' => U('index')
        ];
        // $path = implode('/', array_reverse($path_arr));
        // return '/'.$path;
        return array_reverse($path_arr);
    }


    // 获取文件夹列表树方法
    public function getDirTree($d_id = null, $tree = [], $p_id = 0, $level = 1){ 
        $Dir = M('dir');
        $list = $Dir->where(['user_id'=>$this->user_id, 'p_id' => $p_id])->select();    // 当前目录下所有子目录
        
        $level_str = '';
        for($i=1; $i<=$level; $i++){ 
            $level_str = $level_str . '|-';
        }

        foreach ($list as $key => $value) {
            // 判断如果$d_id为空，或者当前遍历的元素的id不等于操作目录的ID，才执行遍历操作
            if(empty($d_id) || $value['id'] != $d_id){
                $value['dir_name'] = $level_str.$value['dir_name'];
                $tree[] = $value;
                $p_id = $value['id'];

                // 使用自调函数进行递归
                $tree = $this->getDirTree($d_id, $tree, $p_id, $level+1);
            }
        }

        
        return $tree;
    }
}